﻿package cn.hxsteel.storage.module.user;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.hxsteel.core.exception.ValidateFailException;
import cn.hxsteel.model.vo.PageVO;
import cn.hxsteel.purview.core.config.constant.RoleConst;
import cn.hxsteel.purview.core.tool.PurviewTool;
import cn.hxsteel.purview.model.dao.RoleActionDAO;
import cn.hxsteel.purview.model.dao.UserRoleDAO;
import cn.hxsteel.purview.model.po.CustomerRefRolePO;
import cn.hxsteel.purview.model.po.RoleRefActionPO;
import cn.hxsteel.purview.model.vo.SessionVO;
import cn.hxsteel.storage.core.base.BaseService;
import cn.hxsteel.storage.core.config.Config;
import cn.hxsteel.storage.model.dao.BranchDAO;
import cn.hxsteel.storage.model.dao.CompanyDAO;
import cn.hxsteel.storage.model.dao.CustomerDAO;
import cn.hxsteel.storage.model.po.BranchPO;
import cn.hxsteel.storage.model.po.CompanyPO;
import cn.hxsteel.storage.model.po.CustomerPO;
import cn.hxsteel.storage.model.vo.UserLoginVO;
import cn.hxsteel.storage.module.user.model.BranchBO;
import cn.hxsteel.storage.module.user.model.UserBO;

/**
 * 用户服务器
 */
@Service
class UserService extends BaseService
{
    @Autowired
    private CustomerDAO   userDAO;
    @Autowired
    private CompanyDAO    companyDAO;
    @Autowired
    private BranchDAO     branchDAO;
    @Autowired
    private UserRoleDAO   _userRoleDAO;
    @Autowired
    private RoleActionDAO _roleActionDAO;
    
    /**
     * 注册用户
     * 
     * @param CustomerPO 用户持久化类
     */
    public void register( CustomerPO CustomerPO )
	    throws ValidateFailException
    {
	boolean existUsername = existUsername( CustomerPO.getUsername() );
	if ( existUsername )
	{
	    throw new ValidateFailException( "该名称已被使用，请换一个吧。" );
	}
	else
	{
	    userDAO.save( CustomerPO );
	}
    }
    
    /**
     * 是否存在指定用户名
     * 
     * @param username 用户名称
     */
    public boolean existUsername( String username )
    {
	return userDAO.selObjectByUsername( username ) != null;
    }
    
    /**
     * 是否存在指定用户名
     * 
     * @param id 用户标识
     * @param username 用户名称
     */
    public boolean existUsernameAndID( int id, String username )
    {
	return userDAO.selObjectByUsernameAndID( id, username ) != null;
    }
    
    /**
     * 请求登录
     * 
     * @param userLoginVO 用户的登录值对象
     * @return
     * @throws ValidateFailException
     */
    public CustomerPO login( UserLoginVO userLoginVO )
	    throws ValidateFailException
    {
	CustomerPO res = userDAO.selObjectByUsername( userLoginVO.getUsername() );
	if ( res == null )
	{
	    throw new ValidateFailException( "用户名不存在" );
	}
	else if ( !Config.DEBUG && !res.getPassword().equals( userLoginVO.getPassword() ) ) { throw new ValidateFailException( "密码不正确" ); }
	return res;
    }
    
    /**
     * 按用户持久获取用户会话对象
     * 
     * @param customerPO 用户持久对象
     * @return
     */
    public SessionVO< CustomerPO > getSessionVO( CustomerPO customerPO )
    {
	SessionVO< CustomerPO > res = new SessionVO< CustomerPO >();
	
	// 设置用户标识
	res.setUid( customerPO.getId() );
	
	// 设置用户的持久对象
	res.setCustomerPO( customerPO );
	
	// 设置角色标识的键集
	List< CustomerRefRolePO > customerRefRolePOs = _userRoleDAO.selPermitList( customerPO.getId() );
	if ( customerRefRolePOs != null )
	{
	    for ( CustomerRefRolePO userRolePO : customerRefRolePOs )
	    {
		res.getRoleIDSet().add( userRolePO.getRoleID() );
	    }
	}
	
	// 设置动作标识的键集（系统管理员，赋予所有动作）
	List< RoleRefActionPO > roleRefActionPOs = null;
	if ( res.getRoleIDSet().contains( RoleConst.SYSTEM_SIGN ) )
	{
	    res.setActionIDSet( PurviewTool.getPurviewActionIDAll() );
	}
	else
	{
	    roleRefActionPOs = _roleActionDAO.selPermitList( customerPO.getId() );
	    if ( roleRefActionPOs != null )
	    {
		for ( RoleRefActionPO roleRefActionPO : roleRefActionPOs )
		{
		    res.getActionIDSet().add( roleRefActionPO.getActionID() );
		}
	    }
	}
	
	return res;
    }
    
    /**
     * 是否存在公司
     * 
     * @param name 公司名称
     */
    public boolean existCompanyByName( String name )
    {
	return companyDAO.selObjectByName( name ) != null;
    }
    
    /**
     * 添加操作是否存在部门 名称
     * 
     * @param name 部门 名称
     * @param uid 部门 UID
     * @param pid 部门 PID
     * @return
     */
    public boolean existBranchBy1( String name, int uid, int pid, int companyid )
    {
	return branchDAO.selObjectBy1( name, uid, pid, companyid ) != null;
    }
    
    /**
     * 修改操作是否存在部门 名称
     * 
     * @param id 部门ID
     * @param name 部门 名称
     * @param uid 部门 UID
     * @param pid 部门 PID
     * @return
     */
    public boolean existBranchBy2( int id, String name, int uid, int pid, int companyid )
    {
	return branchDAO.selObjectBy2( id, name, uid, pid, companyid ) != null;
    }
    
    /**
     * 是否存在指定公司名称
     * 
     * @param id 公司ID
     * @param name 公司名称
     */
    public boolean existCompanyByNameAndID( int id, String name )
    {
	return companyDAO.selObjectByNameAndID( id, name ) != null;
    }
    
    /**
     * 添加公司
     * 
     * @param companyPO 公司持久化对象
     */
    public void addCompany( CompanyPO companyPO )
	    throws ValidateFailException
    {
	
	boolean existcompanyname = existCompanyByName( companyPO.getName() );
	if ( existcompanyname )
	{
	    throw new ValidateFailException( "该公司名称已存在，请换一个。" );
	}
	else
	{
	    companyDAO.save( companyPO );
	}
    }
    
    /**
     * 添加部门
     * 
     * @param branchPO 部门持久化对象
     */
    public void addBranch( BranchPO branchPO )
    {
	branchDAO.save( branchPO );
    }
    
    /**
     * 修改公司
     * 
     * @param companyPO 公司持久化对象
     */
    public void updCompany( CompanyPO companyPO )
	    throws ValidateFailException
    {
	if ( existCompanyByNameAndID( companyPO.getId(), companyPO.getName() ) )
	{
	    throw new ValidateFailException( "该公司名称已存在，请换一个。" );
	}
	else
	{
	    companyDAO.update( companyPO );
	}
    }
    
    /**
     * 查询公司列表
     * 
     * @param uid 公司UID
     */
    public List< CompanyPO > companyList( int uid )
    {
	return companyDAO.selObjectByUID( uid );
    }
    
    /**
     * 查找公司
     * 
     * @param id 公司ID
     */
    public CompanyPO companyById( int id )
    {
	return companyDAO.selObjectByID( id );
    }
    
    /**
     * 查找公司
     * 
     * @param name 公司名称
     */
    public CompanyPO companyByName( String name )
    {
	return companyDAO.selObjectByName( name );
    }
    
    /**
     * 查询部门列表
     * 
     * @param uid 部门UID
     */
    public List< BranchPO > branchListByUID( int uid )
    {
	return branchDAO.selObjectByUID( uid );
    }
    
    /**
     * 查询部门对象
     * 
     * @param id部门ID
     */
    public BranchPO branchByID( int id )
    {
	return branchDAO.selObjectByID( id );
    }
    
    /**
     * 修改部门对象
     * 
     * @param branchPO 部门持久化对象
     */
    public void updBranch( BranchPO branchPO )
    {
	branchDAO.update( branchPO );
    }
    
    /**
     * 分页查找公司
     * 
     * @param pageNo页码
     * @param pageSize 每页显示数目
     * @param uid 公司UID
     * @name 公司名称
     */
    public List< CompanyPO > CompanyPage( int pageNo, int pageSize, int uid, String name )
    {
	PageVO< CompanyPO > pageVO = companyDAO.selPageByNameAndUID( pageNo, pageSize, uid, name );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
    
    /**
     * 分页查找部门
     * 
     * @param pageNo页码
     * @param pageSize 每页显示数目
     * @param uid 部门UID
     * @name 部门名称
     */
    public List< BranchBO > branchPage( int pageNo, int pageSize, int uid, String name )
    {
	PageVO< BranchBO > pageVO = branchDAO.selPageByNameAndPID( pageNo, pageSize, uid, name );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
    
    /**
     * 通过用户ＵＩＤ查找用户对象
     * 
     * @param uid 用户UID
     */
    public List< CustomerPO > userByUID( int uid )
    {
	return userDAO.selObjectByUID( uid );
    }
    
    /**
     * 通过用户ＩＤ查找用户对象
     * 
     * @param id 用户ID
     */
    public CustomerPO userByID( int id )
    {
	return userDAO.selObjectByID( id );
    }
    
    /**
     * 修改用户对象
     * 
     * @param CustomerPO 用户持久化对象
     */
    public void updUser( CustomerPO CustomerPO )
    {
	userDAO.update( CustomerPO );
    }
    
    /**
     * 分页查找用户
     * 
     * @param pageNo页码
     * @param pageSize 每页显示数目
     * @param uid 用户UID
     * @param username 用户名
     */
    public List< UserBO > userPage( int pageNo, int pageSize, int uid, String username )
    {
	PageVO< UserBO > pageVO = userDAO.selPageByUsernameAndUID( pageNo, pageSize, uid, username );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
    
    /**
     * 通过用户ＵＩＤ查找父部门对象
     * 
     * @param uid用户UID
     * @param companyid公司 ID
     */
    public List< BranchPO > branchBy1( int uid, int companyid )
    {
	return branchDAO.selObjectBy1( uid, companyid );
    }
    
    /**
     * 通过用户ＵＩＤ查找部门对象
     * 
     * @param uid用户UID
     * @param companyid公司 ID
     */
    public List< BranchPO > branchBy2( int uid, int companyid )
    {
	return branchDAO.selObjectBy2( uid, companyid );
    }
}